package unionpay.bestnew;

import unionpay.sdk.SDKConfig;
import unionpay.sdk.SDKUtil;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 重要：联调测试时请仔细阅读注释！
 * 
 * 产品：手机控件产�?br>
 * 交易：文件传输类接口：后台获取对账文件交易，只有同步应答 <br>
 * 日期�?2015-09<br>
 * 版本�?1.0.0 
 * 版权�?中国银联<br>
 * 说明：以下代码只是为了方便商户测试�?提供的样例代码，商户可以根据自己�?��，按照技术文档编写�?该代码仅供参考，不提供编码�?能规范�?等方面的保障<br>
 * 交易说明�?对账文件的格式请参�?《全渠道平台接入接口规范 �?部分 文件接口�?
 *           对账文件示例见目录file下的802310048993424_20150905.zip
 *           解析落地后的对账文件可以参�?BaseDemo.java中的parseZMFile();parseZMEFile();方法
 *        
 */
public class Form05_7_FileTransfer extends HttpServlet {

	@Override
	public void init(ServletConfig config) throws ServletException {
		/**
		 * 请求银联接入地址，获取证书文件，证书路径等相关参数初始化到SDKConfig类中
		 * 在java main 方式运行时必须每次都执行加载
		 * 如果是在web应用�?���?这个方法可使用监听的方式写入缓存,无须在这出现
		 */
		//这里已经将加载属性文件的方法挪到了web/AutoLoadServlet.java�?
		//SDKConfig.getConfig().loadPropertiesFromSrc(); //从classpath加载acp_sdk.properties文件
		super.init();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		String merId = req.getParameter("merId");
		String settleDate = req.getParameter("settleDate");
		
		Map<String, String> data = new HashMap<String, String>();
		
		/***银联全渠道系统，产品参数，除了encoding自行选择外其他不�?���?**/
		data.put("version", SDKUtil.version);               //版本�?全渠道默认�?
		data.put("encoding", SDKUtil.encoding_UTF8);             //字符集编�?可以使用UTF-8,GBK两种方式
		data.put("signMethod", "01");                        //签名方法 目前只支�?1-RSA方式证书加密
		data.put("txnType", "76");                           //交易类型 76-对账文件下载
		data.put("txnSubType", "01");                        //交易子类�?01-对账文件下载
		data.put("bizType", "000000");                       //业务类型，固�?
		
		/***商户接入参数***/
		data.put("accessType", "0");                         //接入类型，商户接入填0，不�?���?
		data.put("merId", merId);                	         //商户代码，请替换正式商户号测试，如使用的是自助化平台注册�?77�?��的商户号，该商户号没有权限测文件下载接口的，请使用测试参数里写的文件下载的商户号和日期测。如�?77商户号的真实交易的对账文件，请使用自助化平台下载文件�?
		data.put("settleDate", settleDate);                  //清算日期，如果使用正式商户号测试则要修改成自己想要获取对账文件的日期�?测试环境如果使用700000000000001商户号则固定填写0119
		data.put("txnTime", DemoBase.getCurrentTime());       //订单发�?时间，取系统时间，格式为YYYYMMDDhhmmss，必须取当前时间，否则会报txnTime无效
		data.put("fileType", "00");                          //文件类型，一般商户填�?0即可
		
		/**请求参数设置完毕，以下对请求参数进行签名并发送http post请求，接收同步应答报�?------------>**/
		
		Map<String, String> submitFromData = SDKUtil.signData(data, SDKUtil.encoding_UTF8);	//报文中certId,signature的�?是在signData方法中获取并自动赋�?的，只要证书配置正确即可�?
		
		String url = SDKConfig.getConfig().getFileTransUrl();								//获取请求银联的前台地�?��对应属�?文件acp_sdk.properties文件中的acpsdk.fileTransUrl
	
		Map<String, String> resmap = SDKUtil.submitUrl(submitFromData, url, SDKUtil.encoding_UTF8);
		
		/**对应答码的处理，请根据您的业务�?辑来编写程序,以下应答码处理�?辑仅供参�?------------>**/
		
		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规�?�?部分-附录�?
		if(("00").equals(resmap.get("respCode"))){
			//交易成功，解析返回报文中的fileContent并默认落地成文件
			SDKUtil.deCodeFileContent(resmap,"D:\\", SDKUtil.encoding_UTF8);
			//TODO
		}else{
			//其他应答码为失败请排查原�?
			//TODO
		}
		
		String reqMessage = DemoBase.genHtmlResult(submitFromData);
		String rspMessage = DemoBase.genHtmlResult(resmap);
		resp.getWriter().write("对账文件下载交易</br>请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

}
